Versi 1
| Field | Isi |
|---|---|
| Dokumen ID | VBS-LAP-018 |
| Deskripsi | Kumpulan laporan penjualan per dimensi: per invoice, rinci per barang, per customer, per barang, per jenis barang, per jenis customer, per cabang, per user, per sales, tunai versus kredit, penerimaan kontan per metode bayar, bulanan dan pajak UMKM, penjualan aset rinci, serta laporan custom pivot |
| Nomor Revisi | 1 |
| Tanggal | 2026-10-04 |
| Keterangan | Dokumentasi baseline dari dokumentasi fitur demo dan kode FE |
1. Ringkasan
a. In scope
- User membuka daftar Laporan Penjualan dan hanya melihat laporan yang diizinkan perannya.
- Laporan yang dicakup: penjualan per invoice, penjualan rinci, penjualan per customer, penjualan per barang, penjualan per jenis barang, penjualan per jenis customer, penjualan per cabang, penjualan kontan per user, penjualan per sales, penjualan tunai versus kredit, penerimaan atas penjualan kontan per metode bayar, penjualan bulanan dan pajak UMKM, penjualan aset rinci, dan laporan custom penjualan (pivot).
- User mengisi periode dan mode penjualan: hanya kasir, hanya grosir kontan, semua penjualan kontan, atau semua penjualan.
- User memfilter sesuai laporan: cabang, customer, user, sales, cluster, jenis customer, jenis barang, barang, aset, status tagihan, dan jatuh tempo.
- User melihat total ringkas (sebelum PPN, lunas, belum lunas) dan membuka invoice penjualan asal.
- User melihat rincian metode pembayaran per invoice.
- User menghitung PPh final UMKM 0,5% per bulan dengan mode pajak pribadi atau badan usaha.
- User menyusun laporan pivot dengan baris, kolom, dan nilai yang dipilih, lalu menyimpan susunan sebagai template.
- User mengekspor laporan ke Excel sesuai hak akses.
b. Catatan
c. Kesimpulan
- [FE] -
- [BE] -
2. Functional Requirement
| Kode | Deskripsi |
|---|---|
| FR-01 | Hub /brand/:id/laporan-penjualan menampilkan kartu laporan sesuai izin user |
| FR-02 | Penjualan per invoice (/daftar-penjualan) menampilkan daftar invoice tercetak beserta customer, user, jatuh tempo, status tagihan, total, dan PPN untuk brand PKP |
| FR-03 | User dapat melihat rincian metode pembayaran sebuah invoice dari pembayaran kontan dan pelunasan piutang |
| FR-04 | Penjualan rinci (/penjualan-rinci) menampilkan baris barang per invoice: barang, jenis, satuan, kuantitas, harga jual, diskon, subtotal |
| FR-05 | Laporan per dimensi menampilkan agregat penjualan per customer (/penjualan-perpelanggan), per user (/penjualan-peruser), per jenis customer (/penjualan-perjeniscus), per cabang (/penjualan-pergudang), per sales (/penjualan-persales), tunai versus kredit (/penjualan-tunai-vs-kredit), dan kontan per metode bayar (/penjualan-kontan-metodebayar) |
| FR-06 | Penjualan per barang (/penjualan-perbarang) dan per jenis barang (/penjualan-perjenisbarang) menampilkan kuantitas, total, persentase, dan persentase kumulatif |
| FR-07 | Penjualan bulanan dan pajak UMKM (/penjualan-bulanan-pajakumkm) menampilkan omzet per bulan dalam satu tahun beserta PPh final 0,5% |
| FR-08 | Penjualan aset rinci (/penjualan-aset-rinci) menampilkan baris aset terjual per invoice |
| FR-09 | Laporan custom penjualan (/laporan-penjualan-pivot) menyusun pivot dari baris, kolom, dan nilai terpilih serta menyimpan template ke konfigurasi brand |
| FR-10 | User dengan izin Excel dapat mengekspor laporan yang sedang tampil ke file Excel |
3. Use Case List
| Kode | Deskripsi |
|---|---|
| UC-01 | Membuka daftar laporan penjualan |
| UC-02 | Melihat penjualan per invoice |
| UC-03 | Melihat rincian metode pembayaran invoice |
| UC-04 | Melihat penjualan rinci per barang |
| UC-05 | Melihat penjualan per dimensi |
| UC-06 | Melihat penjualan per barang dan jenis barang |
| UC-07 | Melihat penjualan bulanan dan pajak UMKM |
| UC-08 | Melihat penjualan aset rinci |
| UC-09 | Menyusun laporan pivot penjualan dan menyimpan template |
| UC-10 | Mengekspor laporan penjualan ke Excel |
4. Use Case Scenario
UC-01 : Membuka daftar laporan penjualan
| Aktor | User dengan akses laporan penjualan |
| Deskripsi | User memilih laporan penjualan yang ingin dibuka |
| Prekondisi | User sudah login dan brand aktif |
| Alur utama | 1. User membuka menu Laporan lalu tab Penjualan. 2. Sistem menampilkan kartu laporan yang diizinkan. 3. User memilih salah satu kartu. 4. Sistem membuka halaman laporan dalam kondisi kosong dengan pesan "Lengkapi filter untuk menampilkan data". |
| Alur negatif | - Jika user tidak memiliki izin laporan tertentu, kartunya tidak ditampilkan. |
| Bisnis rule | - Izin per kartu: #lap-penjualan-per-invoice, #lap-penjualan-rinci, #lap-penjualan-customer, #lap-penjualan-per-user, #lap-penjualan-jenis-customer, #lap-penjualan-per-barang, #lap-penjualan-jenis-barang, #lap-penjualan-sales, #lap-tunai-vs-kredit, #lap-penjualan-per-gudang, #lap-kontan-vs-metpen, #lap-bulanan-vs-pajak-umkm, dan izin laporan custom penjualan.- Penjualan aset rinci tidak memiliki kartu di hub dan dibuka langsung lewat alamat halaman. - Tombol kembali di setiap laporan mengarah ke hub laporan penjualan. |
| Postkondisi | Halaman laporan terpilih terbuka |
| Trigger | User membuka tab Penjualan pada menu Laporan |
| Kode FR | FR-01 |
UC-02 : Melihat penjualan per invoice
| Aktor | User penjualan / akuntansi |
| Deskripsi | User melihat daftar invoice penjualan dalam periode beserta status tagihannya |
| Prekondisi | User memiliki izin #lap-penjualan-per-invoice |
| Alur utama | 1. User mengisi periode, cabang, dan mode penjualan. 2. User dapat menambah filter customer, user, cluster, status tagihan, dan jatuh tempo. 3. User menekan tombol tampilkan. 4. Sistem menampilkan invoice: tanggal, nomor invoice, customer, user, jatuh tempo, status tagihan, dan total. 5. Sistem menampilkan kartu total sebelum PPN, total lunas, dan total belum lunas. 6. User dapat mengklik nomor invoice untuk membuka invoice di tab baru. |
| Alur negatif | - Jika periode kosong, muncul alert "Periode Tidak Boleh Kosong". - Jika mode penjualan kosong, muncul alert "Mode Penjualan harus diisi!". - Jika data kosong atau gagal dimuat, muncul notifikasi "Data yang anda filter tidak ditemukan silahkan ganti filter". |
| Bisnis rule | - Hanya invoice tercetak yang diambil. - Mode hanya kasir: invoice kasir dengan tempo 0. Mode hanya grosir kontan: invoice non kasir dengan tempo 0. Mode semua kontan: tempo 0. Mode semua penjualan: tanpa batasan. - Filter user dipetakan ke user pembuat invoice. - Jatuh tempo = tanggal invoice + tempo hari. - Kolom total sebelum PPN dan PPN hanya tampil bila brand berstatus Pengusaha Kena Pajak. - Total belum lunas memakai sisa piutang, bukan total invoice. |
| Postkondisi | Daftar invoice dan total ringkas tampil |
| Trigger | User menekan tombol tampilkan |
| Kode FR | FR-02 |
UC-03 : Melihat rincian metode pembayaran invoice
| Aktor | User penjualan / akuntansi |
| Deskripsi | User melihat komposisi metode pembayaran yang melunasi sebuah invoice |
| Prekondisi | Laporan per invoice, per customer, per user, atau per sales sudah tampil |
| Alur utama | 1. User mengklik nilai total pada baris invoice. 2. Sistem membuka popup metode pembayaran. 3. Sistem menggabungkan pembayaran kontan saat penjualan dan pembayaran pelunasan piutang. 4. Popup menampilkan nama metode pembayaran dan total nominalnya. |
| Alur negatif | - Jika invoice belum dibayar, popup tidak menampilkan baris. - Jika salah satu sumber gagal dimuat, data dari sumber lain tetap ditampilkan. |
| Bisnis rule | - Pembayaran piutang yang dihitung hanya dari invoice bayar piutang yang sudah tercetak. - Nominal dikelompokkan per metode pembayaran. |
| Postkondisi | Komposisi metode pembayaran invoice tampil |
| Trigger | User mengklik total invoice |
| Kode FR | FR-03 |
UC-04 : Melihat penjualan rinci per barang
| Aktor | User penjualan / akuntansi |
| Deskripsi | User melihat setiap baris barang yang terjual pada invoice dalam periode |
| Prekondisi | User memiliki izin #lap-penjualan-rinci |
| Alur utama | 1. User mengisi periode, cabang, dan mode penjualan. 2. User dapat menambah filter customer, cluster, jenis barang, barang, dan status tagihan. 3. User menekan tombol tampilkan. 4. Sistem menampilkan baris barang per invoice: nama barang, jenis barang, satuan, kuantitas, harga jual, diskon 1, diskon 2, dan subtotal. |
| Alur negatif | - Jika periode kosong, muncul alert "Periode Tidak Boleh Kosong". - Jika data kosong, muncul notifikasi data tidak ditemukan. |
| Bisnis rule | - Jika hasil lebih dari 5.000 baris, tampilan tidak memakai paginasi lokal. - Nama SKU, satuan, dan customer dilengkapi dari master. |
| Postkondisi | Rincian barang terjual tampil |
| Trigger | User menekan tombol tampilkan |
| Kode FR | FR-04 |
UC-05 : Melihat penjualan per dimensi
| Aktor | User penjualan / akuntansi |
| Deskripsi | User melihat agregat penjualan menurut customer, user kasir, jenis customer, cabang, sales, tunai versus kredit, atau metode bayar kontan |
| Prekondisi | User memiliki izin laporan dimensi terkait |
| Alur utama | 1. User membuka laporan dimensi yang diinginkan. 2. User mengisi periode, mode penjualan, dan pilihan dimensi (customer, user, jenis customer, cabang, atau sales). 3. User menekan tombol tampilkan. 4. Sistem menampilkan agregat per dimensi: jumlah invoice, invoice belum terbayar, invoice belum diproses, total belum dibayar, total lunas, dan total semua penjualan sesuai laporan. 5. User dapat membuka rincian invoice per baris dimensi. |
| Alur negatif | - Jika periode kosong, muncul alert "Periode Tidak Boleh Kosong". - Jika data kosong atau gagal dimuat, muncul notifikasi "Data yang anda filter tidak ditemukan silahkan ganti filter". |
| Bisnis rule | - Per customer dan per sales ikut mengambil invoice yang belum tercetak agar kolom invoice belum diproses dapat dihitung. - Per user dikelompokkan berdasarkan user kasir. - Per cabang dan tunai versus kredit membedakan penjualan tunai (tempo 0) dan tempo atau kredit (tempo lebih dari 0). - Kontan per metode bayar dikelompokkan per user kasir dan tanggal, lalu dipecah per metode pembayaran. |
| Postkondisi | Agregat penjualan per dimensi tampil |
| Trigger | User menekan tombol tampilkan |
| Kode FR | FR-05 |
UC-06 : Melihat penjualan per barang dan jenis barang
| Aktor | User penjualan / akuntansi |
| Deskripsi | User melihat kontribusi tiap barang atau jenis barang terhadap total penjualan |
| Prekondisi | User memiliki izin #lap-penjualan-per-barang |
| Alur utama | 1. User membuka penjualan per barang atau per jenis barang. 2. User mengisi periode, cabang, mode penjualan, dan filter jenis barang bila perlu. 3. User menekan tombol tampilkan. 4. Sistem menampilkan kuantitas, total, persentase, dan persentase kumulatif. 5. Pada penjualan per barang, user dapat membuka popup rincian invoice per SKU. |
| Alur negatif | - Jika data kosong, muncul notifikasi data tidak ditemukan. |
| Bisnis rule | - Penyebutan ganda penjualan per barang pada demo merujuk ke satu halaman yang sama. - Persentase kumulatif dihitung berurutan dari barang dengan kontribusi terbesar. |
| Postkondisi | Kontribusi barang atau jenis barang tampil |
| Trigger | User menekan tombol tampilkan |
| Kode FR | FR-06 |
UC-07 : Melihat penjualan bulanan dan pajak UMKM
| Aktor | User akuntansi / pajak |
| Deskripsi | User melihat omzet bulanan setahun dan estimasi PPh final UMKM |
| Prekondisi | User memiliki izin #lap-bulanan-vs-pajak-umkm |
| Alur utama | 1. User memilih tahun, cabang, dan mode pajak (pribadi atau badan usaha). 2. User menekan tombol tampilkan. 3. Sistem menampilkan omzet per bulan (total penjualan dikurangi PPN) dan PPh per bulan. 4. Sistem menampilkan total omzet ditambah PPh. |
| Alur negatif | - Jika data tahun tersebut kosong, muncul notifikasi data tidak ditemukan. |
| Bisnis rule | - Periode selalu satu tahun penuh. - Tarif PPh final 0,5%. - Mode badan usaha: seluruh omzet bulanan dikenai PPh. - Mode pribadi: PPh hanya atas omzet kumulatif tahun berjalan di atas Rp500.000.000, dihitung dari selisihnya pada bulan saat batas terlampaui dan penuh pada bulan berikutnya. |
| Postkondisi | Omzet bulanan dan PPh tampil |
| Trigger | User menekan tombol tampilkan |
| Kode FR | FR-07 |
UC-08 : Melihat penjualan aset rinci
| Aktor | User akuntansi / aset |
| Deskripsi | User melihat aset yang terjual per invoice penjualan aset |
| Prekondisi | User memiliki izin #lap-penjualan-aset-rinci |
| Alur utama | 1. User membuka halaman penjualan aset rinci. 2. User mengisi periode dan cabang, lalu filter customer, aset, dan cluster bila perlu. 3. User menekan tombol tampilkan. 4. Sistem menampilkan per cabang dan customer per tanggal: nama aset, satuan, kuantitas, subtotal, diskon 1, dan diskon 2. |
| Alur negatif | - Jika periode kosong, muncul alert "Periode Tidak Boleh Kosong". - Jika data kosong, muncul notifikasi data tidak ditemukan. |
| Bisnis rule | - Mode penjualan tidak dipakai pada laporan ini. - Filter aset diterapkan pada baris aset, bukan pada invoice. |
| Postkondisi | Rincian penjualan aset tampil |
| Trigger | User menekan tombol tampilkan |
| Kode FR | FR-08 |
UC-09 : Menyusun laporan pivot penjualan dan menyimpan template
| Aktor | User dengan izin laporan custom penjualan |
| Deskripsi | User menyusun laporan penjualan bebas berdasarkan baris, kolom, dan nilai yang dipilih |
| Prekondisi | User membuka laporan custom penjualan |
| Alur utama | 1. User memilih periode, nilai yang dihitung (mis. total penjualan, sisa piutang, rata-rata), kolom, dan baris. 2. User menekan tombol tampilkan. 3. Sistem menampilkan tabel pivot dan user dapat mengurutkan baris atau kolom. 4. User menekan simpan template lalu mengisi nama template. 5. Sistem menyimpan susunan ke konfigurasi brand dan template muncul di daftar laporan tersimpan. 6. User dapat memilih template tersimpan untuk langsung memuat susunan yang sama. |
| Alur negatif | - Jika periode, nilai, baris, atau kolom kosong, muncul notifikasi "Oops Silahkan cek kembali form anda!". - Jika nama template kosong, muncul alert "Nama Template Harus Diisi". - Jika simpan gagal, muncul alert pesan error dari server. |
| Bisnis rule | - Maksimal 4 baris pivot. - Baris atau kolom tahun, kuartal, dan bulan diproses sebagai periode, bukan sebagai kolom pengelompokan. - Template penjualan disimpan pada daftar laporan penjualan di konfigurasi brand. - Mengubah susunan setelah laporan tampil mengosongkan hasil sampai ditampilkan ulang. |
| Postkondisi | Pivot tampil dan template tersimpan |
| Trigger | User menekan tampilkan atau simpan template |
| Kode FR | FR-09 |
UC-10 : Mengekspor laporan penjualan ke Excel
| Aktor | User dengan izin Excel laporan terkait |
| Deskripsi | User mengunduh laporan penjualan yang sedang tampil ke Excel |
| Prekondisi | Laporan sudah tampil dan user memiliki izin excel pada laporan tersebut |
| Alur utama | 1. User menekan tombol export Excel. 2. Sistem menyusun baris dari data tabel yang tampil. 3. Browser mengunduh file Excel, mis. "Laporan Penjualan per Invoice.xlsx". |
| Alur negatif | - Jika periode kosong, muncul alert "Periode Tidak Boleh Kosong". - Jika data belum ada, muncul notifikasi "Data tidak ditemukan". |
| Bisnis rule | - Kolom PPN dan total sebelum PPN hanya ikut diekspor bila brand PKP. - Status tagihan diekspor sebagai "Lunas" atau "Belum Dibayar". - Ekspor dibuat di browser tanpa memanggil API baru. |
| Postkondisi | File Excel terunduh |
| Trigger | User menekan tombol export Excel |
| Kode FR | FR-10 |
5. Data Flow Diagram
DFD-01 — Alur data laporan penjualan
6. Sequence Diagram
SD-01 — UC-01 : Membuka daftar laporan penjualan
SD-02 — UC-02 : Melihat penjualan per invoice
SD-03 — UC-03 : Melihat rincian metode pembayaran invoice
SD-04 — UC-04 : Melihat penjualan rinci per barang
SD-05 — UC-05 : Melihat penjualan per dimensi
SD-06 — UC-06 : Melihat penjualan per barang dan jenis barang
SD-07 — UC-07 : Melihat penjualan bulanan dan pajak UMKM
SD-08 — UC-08 : Melihat penjualan aset rinci
SD-09 — UC-09 : Menyusun laporan pivot penjualan dan menyimpan template
SD-10 — UC-10 : Mengekspor laporan penjualan ke Excel
7. Table Schema
8. API Schema
| Endpoint | Status | Perubahan |
|---|---|---|
POST /laporan-penjualan/sales-report | existing | - |
POST /laporan-penjualan/detailed-sales-report | existing | - |
GET /laporan-penjualan/laporan-metode-pembayaran | existing | - |
POST /laporan-penjualan/penjualan-aset-report | existing | - |
POST /financial-report/pembayaran-piutang-report | existing | - |
GET /metode-pembayaran | existing | - |
GET /customer | existing | - |
GET /gudang | existing | - |
GET /cluster | existing | - |
GET /user | existing | - |
GET /karyawan | existing | - |
GET /person | existing | - |
GET /satuan | existing | - |
POST /sku/get-bulk-sku | existing | - |
GET /brand/all-users | existing | - |
PUT /brand/config/:id | existing | - |
GET /brand/:brand_id | existing | - |